package com.xu.common.util;

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author 徐老板
 * @date 2020/4/1   16:19
 */
//这个里面写对redis的增删改查 还有就是锁 虽然用不上
// 还有就是连接redis 都放在这个类里面
public class RedissionUtil {
    public static RedissonClient client;

    //通过静态代码块完成初始化配置
    static {
        Config config =new Config();
        config.useSingleServer().setAddress("redis://192.168.95.20:6379");
        client = Redisson.create(config);
    }

    //接下来写增删改查的操作
    public static void saveStr(String key,String val){
        client.getBucket(key).set(val);
    }

    public static void saveHash(String key, String field,String val){
        client.getMap(key).put(field, val);
    }
    //一下子存所有
    public static void saveHash(String key, Map<String,String> map){
        client.getMap(key).putAll(map);
    }

    public static void saveList(String key, String val){

        client.getList(key).add(val);
    }

    public static void saveHash(String key,String field,String val,int seconds){
        RMap rMap=client.getMap(key);
        rMap.expire(seconds, TimeUnit.SECONDS);
        rMap.put(field,val);
    }

    //设置有效期
    public static void setExpire(String key,int seconds){
        client.getKeys().expire(key, seconds, TimeUnit.SECONDS);
    }
    //查询
    public static String getHashVal(String key,String field){
        return (String) client.getMap(key).get(field);
    }

    //检查指定的字段是否存在
    public static boolean checkHash(String key,String field){
        RMap<Object, Object> rmap = client.getMap(key);
        if (rmap !=null){
            return rmap.containsKey(key);
        }else {
            return false;
        }
    }

    //检查指定的key是否存在
    //这个很巧 因为没有直接判断是否存在的 所以这里用有效期时间来判断 我是这么猜的哈
    //看了源码发现就是用数值类型来判断是否存在 不存在通过有效期判断一说
    public static boolean checkKey(String key){
        return client.getKeys().countExists(key)>0;
    }

    //删除
    public static void delHash(String key,String field){
        client.getMap(key).remove(field);
    }

    //分布式锁
    public static RLock lock(String key){
        RLock rlock = client.getLock(key);
        rlock.lock();
        //这里可以加异步的方法
//        rlock.lockAsync();
        return rlock;
    }

    public static void unlock(String key){
        client.getLock(key).unlock();
    }

}
